package com.sky.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.entity.DishFlavor;
import com.sky.entity.Setmeal;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.mapper.DishFlavorMapper;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealDishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.result.PageResult;
import com.sky.service.DishService;
import com.sky.vo.DishVO;

import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class DishServiceImpl implements DishService{
		@Autowired
		private DishMapper dishMapper;
		@Autowired
	    private DishFlavorMapper dishFlavorMapper;
		@Autowired
		SetmealMapper  setmealMapper;
		 @Transactional
	 public void saveWithFlavor(DishDTO dishDTO) {
		// TODO 自动生成的方法存根
			 //将客户端传过来的dishDTO数据转换为dish
		Dish dish = new Dish();
		BeanUtils.copyProperties(dishDTO, dish);
		dishMapper.insert(dish);
		//获取insert的主键值
		Long dishId = dish.getId();
		
		List<DishFlavor> flavors = dishDTO.getFlavors();
		if (flavors != null && flavors.size() > 0) {
            flavors.forEach(dishFlavor -> {
                dishFlavor.setDishId(dishId);
            });
            dishFlavorMapper.insertBatch(flavors);
		
	}

}
		@Override
		public PageResult page(DishPageQueryDTO dishdto) {
			// TODO 自动生成的方法存根
			//将dto转化成dish基本类
			PageHelper.startPage(dishdto.getPage(), dishdto.getPageSize());
	        Page<DishVO> page = dishMapper.pageQuery(dishdto);//后绪步骤实现
	        return new PageResult(page.getTotal(), page.getResult());
		}
		@Autowired
		private SetmealDishMapper setmealDishMapper;
		 @Transactional//事务
		 @Override
	    public void deleteBranch(List<Long> ids) {
	        //判断当前菜品是否能够删除---是否存在起售中的菜品？？
	        for (Long id : ids) {
	            Dish dish = dishMapper.getById(id);//后绪步骤实现
	            if (dish.getStatus() == StatusConstant.ENABLE) {
	                //当前菜品处于起售中，不能删除
	                throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE);
	            }
	        }

	        //判断当前菜品是否能够删除---是否被套餐关联了？？
	        List<Long> setmealIds = setmealDishMapper.getSetmealIdsByDishIds(ids);
	        if (setmealIds != null && setmealIds.size() > 0) {
	            //当前菜品被套餐关联了，不能删除
	            throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL);
	        }

	        //删除菜品表中的菜品数据
	        for (Long id : ids) {
	            dishMapper.deleteById(id);//后绪步骤实现
	            //删除菜品关联的口味数据
	            dishFlavorMapper.deleteByDishId(id);//后绪步骤实现
	        }
	    }
		@Override
		public DishVO getByIdWithFlavor(Long id) {
			// TODO 自动生成的方法存根
			//根据id查询菜品数据
			Dish dish = dishMapper.getById(id);
			//根据菜品id查询口味
			List<DishFlavor> dishFlavors = dishFlavorMapper.getByDishId(id);
			//将查询的数据封装在VO中
			DishVO dishVo = new DishVO();
			BeanUtils.copyProperties(dish, dishVo);
			dishVo.setFlavors(dishFlavors);
			return dishVo;
		}
		@Override
		public void update(DishDTO dishDto) {
			// TODO 自动生成的方法存根
			//先转化为Dish对象
			Dish dish = new Dish();
			BeanUtils.copyProperties(dishDto, dish);
			//修改菜品表基本信息
	        dishMapper.update(dish);

	        //删除原有的口味数据
	        dishFlavorMapper.deleteByDishId(dishDto.getId());

	        //重新插入口味数据
	        List<DishFlavor> flavors = dishDto.getFlavors();
	        if (flavors != null && flavors.size() > 0) {
	            flavors.forEach(dishFlavor -> {
	                dishFlavor.setDishId(dishDto.getId());
	            });
	            //向口味表插入n条数据
	            dishFlavorMapper.insertBatch(flavors);
			
		}
	}
		@Override
		public void StartOrStop(Integer status, Long id) {
			// TODO 自动生成的方法存根
			//将状态封装为dish
			Dish dish = Dish.builder()
					.status(status)
					.id(id)
					.build();
			dishMapper.update(dish);
			if (status == StatusConstant.DISABLE) {
		        // 如果是停售操作，还需要将包含当前菜品的套餐也停售
		        List<Long> dishIds = new ArrayList<>();
		        dishIds.add(id);
		        // select setmeal_id from setmeal_dish where dish_id in (?,?,?)
		        List<Long> setmealIds = setmealDishMapper.getSetmealIdsByDishIds(dishIds);
		        if (setmealIds != null && setmealIds.size() > 0) {
		            for (Long setmealId : setmealIds) {
		                Setmeal setmeal = Setmeal.builder()
		                    .id(setmealId)
		                    .status(StatusConstant.DISABLE)
		                    .build();
						setmealMapper.update(setmeal);
		            }
		        }
		    }
		}
		@Override
		public List<Dish> list(Long categoryId) {
			// TODO 自动生成的方法存根
			  Dish dish = Dish.builder()
				        .categoryId(categoryId)
				        .status(StatusConstant.ENABLE)
				        .build();
			  return dishMapper.list(dish);
		}
}
